package br.com.commercy.dominio.entidade;

import java.io.Serializable;
import java.util.Collection;
import java.util.Date;
import java.util.HashSet;

import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Enumerated;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToMany;
import javax.persistence.ManyToOne;
import javax.persistence.OneToOne;
import javax.persistence.SequenceGenerator;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;

import org.hibernate.annotations.IndexColumn;

import br.com.commercy.dominio.entidade.dominio.enuns.EnumTipoFrete;
import br.com.commercy.dominio.entidade.dominio.enuns.EnumTipoPedido;
import br.com.commercy.infra.arquitetura.entidade.Entidade;

@SuppressWarnings("serial")
@Entity
@Table(name="TBL_PEDIDO")
@SequenceGenerator(name="SEQ_PEDIDO", sequenceName="SEQ_PEDIDO")
public class Pedido implements Entidade {
	
	@Id
	@GeneratedValue(strategy = GenerationType.AUTO,generator="SEQ_PEDIDO")
	private Long codigo;

	@Column(name="NUMERO_PEDIDO")
	private Long numeroPedido;
	
	@Column(name="ORDEM_NUMERO")
	private Long ordemNumero;
	
	@Temporal(TemporalType.DATE)
	@Column(name="DATA_EMICAO")
	private Date dataEmissao;
	
	@Temporal(TemporalType.DATE)
	@Column(name="EMBARCAR_EM")
	private Date embarcarEm;
	
	@ManyToOne
	@JoinColumn(name="CLIENTE",nullable=false)
	private Cliente cliente;
	
	@Column(name="TIPO_FRETE")
	@Enumerated
	private EnumTipoFrete tipoFrete;
	
	@Column(name="TIPO_PEDIDO")
	@Enumerated
	private EnumTipoPedido tipoPedido;
	
	@Column(name="TIPO_PAGAMENTO")
	@Enumerated
	private EnumTipoPedido tipoPagamento;
	
	@Column(name="TIPO_COBRANCA")
	@Enumerated
	private EnumTipoPedido tipoCobranca;
	
	@OneToOne
	@JoinColumn(name="ENDERECO_ENTREGA")
	private Endereco enderecoEntrega;
	
	@OneToOne
	@JoinColumn(name="ENDERECO_COBRANCA")
	private Endereco enderecoCobranca;
	
	@Column(name="OBSERVACOES")
	private String observacoes;
	
	@ManyToMany(fetch = FetchType.EAGER, cascade = CascadeType.ALL)
	@Column(name="PRODUTOS")
	@IndexColumn(name="PRODUTOS_INDEX")
	private Collection<Produto> produtos;
	
	@ManyToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
	@Column(name="DIAS_PARA_COBRANCA")
	@IndexColumn(name="DIAS_INDEX")
	private Collection<DiasCobranca> dias;
	
	@Column(name="VALOR_IPI")
	private Double valorIPI;
	
	@Column(name="VALOR_DESCONTOS")
	private Double valorDescontos;
	
	@Column(name="VALOR_PRODUTOS")
	private Double valorProdutos;
	
	@Column(name="VALOR_TOTAL")
	private Double valorTotal;
	
	@Column(name="PESO_LIQUIDO")
	private Float pesoLiquido;
	
	@Column(name="PESO_BRUTO")
	private Float pesoBruto;
	
	@Column(name="CUBAGEM")
	private Float cubagem;
	
	
	@Override
	public Serializable getIdentificador() {
		// TODO Auto-generated method stub
		return codigo;
	}

	@Override
	public String getDescricao() {
		// TODO Auto-generated method stub
		return null;
	}

	public Long getCodigo() {
		return codigo;
	}

	public void setCodigo(Long codigo) {
		this.codigo = codigo;
	}

	public Long getNumeroPedido() {
		return numeroPedido;
	}

	public void setNumeroPedido(Long numeroPedido) {
		this.numeroPedido = numeroPedido;
	}

	public Long getOrdemNumero() {
		return ordemNumero;
	}

	public void setOrdemNumero(Long ordemNumero) {
		this.ordemNumero = ordemNumero;
	}

	public Date getDataEmissao() {
		return dataEmissao;
	}

	public void setDataEmissao(Date dataEmissao) {
		this.dataEmissao = dataEmissao;
	}

	public Date getEmbarcarEm() {
		return embarcarEm;
	}

	public void setEmbarcarEm(Date embarcarEm) {
		this.embarcarEm = embarcarEm;
	}

	public Cliente getCliente() {
		return cliente;
	}

	public void setCliente(Cliente cliente) {
		this.cliente = cliente;
	}

	public EnumTipoFrete getTipoFrete() {
		return tipoFrete;
	}

	public void setTipoFrete(EnumTipoFrete tipoFrete) {
		this.tipoFrete = tipoFrete;
	}

	public EnumTipoPedido getTipoPedido() {
		return tipoPedido;
	}

	public void setTipoPedido(EnumTipoPedido tipoPedido) {
		this.tipoPedido = tipoPedido;
	}

	public EnumTipoPedido getTipoPagamento() {
		return tipoPagamento;
	}

	public void setTipoPagamento(EnumTipoPedido tipoPagamento) {
		this.tipoPagamento = tipoPagamento;
	}

	public EnumTipoPedido getTipoCobranca() {
		return tipoCobranca;
	}

	public void setTipoCobranca(EnumTipoPedido tipoCobranca) {
		this.tipoCobranca = tipoCobranca;
	}

	

	public Endereco getEnderecoEntrega() {
		return enderecoEntrega;
	}

	public void setEnderecoEntrega(Endereco enderecoEntrega) {
		this.enderecoEntrega = enderecoEntrega;
	}

	public Endereco getEnderecoCobranca() {
		return enderecoCobranca;
	}

	public void setEnderecoCobranca(Endereco enderecoCobranca) {
		this.enderecoCobranca = enderecoCobranca;
	}

	public String getObservacoes() {
		return observacoes;
	}

	public void setObservacoes(String observacoes) {
		this.observacoes = observacoes;
	}

	public Collection<Produto> getProdutos() {
		return produtos;
	}

	public void setProdutos(Collection<Produto> produtos) {
		this.produtos = produtos;
	}

	public Collection<DiasCobranca> getDias() {
		return dias;
	}

	public void setDias(Collection<DiasCobranca> dias) {
		this.dias = dias;
	}

	public Double getValorIPI() {
		return valorIPI;
	}

	public void setValorIPI(Double valorIPI) {
		this.valorIPI = valorIPI;
	}

	public Double getValorDescontos() {
		return valorDescontos;
	}

	public void setValorDescontos(Double valorDescontos) {
		this.valorDescontos = valorDescontos;
	}

	public Double getValorProdutos() {
		return valorProdutos;
	}

	public void setValorProdutos(Double valorProdutos) {
		this.valorProdutos = valorProdutos;
	}

	public Double getValorTotal() {
		return valorTotal;
	}

	public void setValorTotal(Double valorTotal) {
		this.valorTotal = valorTotal;
	}

	public Float getPesoLiquido() {
		return pesoLiquido;
	}

	public void setPesoLiquido(Float pesoLiquido) {
		this.pesoLiquido = pesoLiquido;
	}

	public Float getPesoBruto() {
		return pesoBruto;
	}

	public void setPesoBruto(Float pesoBruto) {
		this.pesoBruto = pesoBruto;
	}

	public Float getCubagem() {
		return cubagem;
	}

	public void setCubagem(Float cubagem) {
		this.cubagem = cubagem;
	}

	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result + ((codigo == null) ? 0 : codigo.hashCode());
		return result;
	}

	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		Pedido other = (Pedido) obj;
		if (codigo == null) {
			if (other.codigo != null)
				return false;
		} else if (!codigo.equals(other.codigo))
			return false;
		return true;
	}
	
	

}
